Sorces:
#scientific/ploting
import numpy as np
import scipy as sc
import matplotlib.pyplot as plt
#saving audios
from scipy.io.wavfile import write
from pydub import AudioSegment
from pydub.playback import play
#display on screen
from IPython.display import display, HTML
#colors
WARNING = '\033[93m'
HEADER = '\033[95m'
BOLD = '\033[1m'
END = '\033[0m'
#class containing methods I wrote
from audio import Audio
#Clean cosine signal
filename = "clean_cosine.wav"
for freq in [100,500,1000,1500,2000]:
print(WARNING+"Frequency: "+str(freq)+END)
cos_clean = Audio()
cos_clean.generate_cosine_wave(freq=freq)
cos_clean.save_audio(filename)
print(BOLD+"No filter:"+END)
cos_clean.plot_signal("Pure cosine signal: "+str(freq)+" Hz",fontsize=30,Nseconds=0.1)
display(cos_clean.read_audio(filename))
#apply high pass
cos_clean.apply_high_pass(filename)
print(BOLD+"High pass filter:"+END)
cos_clean.plot_signal("Pure cosine signal: High pass "+str(freq)+" Hz",fontsize=30,Nseconds=0.1)
display(cos_clean.read_audio(filename))
#apply low pass
cos_clean = Audio()
cos_clean.generate_cosine_wave(freq=freq)
cos_clean.save_audio(filename)
cos_clean.apply_low_pass(filename)
cos_clean.plot_signal("Pure cosine signal: Low pass "+str(freq)+" Hz",fontsize=30,Nseconds=0.1)
display(cos_clean.read_audio(filename))
#apply bandpass
cos_clean = Audio()
cos_clean.generate_cosine_wave(freq=freq)
cos_clean.save_audio(filename)
cos_clean.apply_band_pass(filename)
print(BOLD+"Band pass filter:"+END)
cos_clean.plot_signal("Pure cosine signal: Band pass "+str(freq)+" Hz",fontsize=30,Nseconds=0.1)
display(cos_clean.read_audio(filename))
Frequency: 100 No filter:
High pass filter:
Band pass filter:
Frequency: 500 No filter:
High pass filter:
Band pass filter:
Frequency: 1000 No filter:
High pass filter:
Band pass filter:
Frequency: 1500 No filter:
High pass filter:
Band pass filter:
Frequency: 2000 No filter:
High pass filter:
Band pass filter:
filename = "cos_exp.wav"
for freq in [100,500,1000,1500,2000]:
print(WARNING+"Frequency: "+str(freq)+END)
cos_exp = Audio()
cos_exp.generate_cosine_exp_wave(freq,factor=-.5,duration=6)
cos_exp.save_audio(filename)
print(BOLD+"No filter:"+END)
cos_exp.plot_signal(title="Pure cosine signal with exponential decay: "+str(freq)+" Hz",fontsize=20,Nseconds=6)
display(cos_exp.read_audio(filename))
#apply high pass
cos_exp.apply_high_pass(filename)
print(BOLD+"High pass filter:"+END)
cos_exp.plot_signal("Pure cosine signal with exponential decay: High pass "+str(freq)+" Hz",fontsize=20,Nseconds=6)
display(cos_exp.read_audio(filename))
#apply low pass
cos_exp = Audio()
cos_exp.generate_cosine_exp_wave(freq,factor=-.5,duration=6)
cos_exp.save_audio(filename)
cos_exp.apply_low_pass(filename)
print(BOLD+"Low pass filter:"+END)
cos_exp.plot_signal("Pure cosine signal with exponential decay: Low pass "+str(freq)+" Hz",fontsize=20,Nseconds=6)
display(cos_exp.read_audio(filename))
#apply band pass
cos_exp = Audio()
cos_exp.generate_cosine_exp_wave(freq,factor=-.5,duration=6)
cos_exp.save_audio(filename)
cos_exp.apply_band_pass(filename)
print(BOLD+"Band pass filter:"+END)
cos_exp.plot_signal("Pure cosine signal with exponential decay: Band pass "+str(freq)+" Hz",fontsize=20,Nseconds=6)
display(cos_exp.read_audio(filename))
Frequency: 100 No filter:
High pass filter:
Low pass filter:
Band pass filter:
Frequency: 500 No filter:
High pass filter:
Low pass filter:
Band pass filter:
Frequency: 1000 No filter:
High pass filter:
Low pass filter:
Band pass filter:
Frequency: 1500 No filter:
High pass filter:
Low pass filter:
Band pass filter:
Frequency: 2000 No filter:
High pass filter:
Low pass filter:
Band pass filter:
filename = "cos_exp.wav"
for freq in [100,500,1000,1500,2000]:
print(WARNING+"Frequency: "+str(freq)+END)
cos_exp = Audio()
cos_exp.generate_cosine_exp_wave(freq,amp=0.25,duration=4,factor=0.5)
cos_exp.save_audio(filename)
print(BOLD+"No filter:"+END)
cos_exp.plot_signal(title="Pure cosine signal with exponential elevation: "+str(freq)+" Hz",fontsize=20,Nseconds=4,ylim=False)
display(cos_exp.read_audio(filename))
#apply high pass
cos_exp.apply_high_pass(filename)
print(BOLD+"High pass filter:"+END)
cos_exp.plot_signal("Pure cosine signal with exponential elevation: High pass "+str(freq)+" Hz",fontsize=20,Nseconds=4)
display(cos_exp.read_audio(filename))
#apply low pass
cos_exp = Audio()
cos_exp.generate_cosine_exp_wave(freq,amp=0.25,duration=4,factor=0.5)
cos_exp.save_audio(filename)
cos_exp.apply_low_pass(filename)
print(BOLD+"Low pass filter:"+END)
cos_exp.plot_signal("Pure cosine signal with exponential elevation: Low pass "+str(freq)+" Hz",fontsize=20,Nseconds=4)
display(cos_exp.read_audio(filename))
#apply band pass
cos_exp = Audio()
cos_exp.generate_cosine_exp_wave(freq,amp=0.25,duration=4,factor=0.5)
cos_exp.save_audio(filename)
cos_exp.apply_band_pass(filename)
print(BOLD+"Band pass filter:"+END)
cos_exp.plot_signal("Pure cosine signal with exponential elevation: Band pass "+str(freq)+" Hz",fontsize=20,Nseconds=4)
display(cos_exp.read_audio(filename))
Frequency: 100 No filter:
High pass filter:
Low pass filter:
Band pass filter:
Frequency: 500 No filter:
High pass filter:
Low pass filter:
Band pass filter:
Frequency: 1000 No filter:
High pass filter:
Low pass filter:
Band pass filter:
Frequency: 1500 No filter:
High pass filter:
Low pass filter:
Band pass filter:
Frequency: 2000 No filter:
High pass filter:
Low pass filter:
Band pass filter:
#mixing signals
#generates medium-pintch tone (nice_tone) and high-pintch tone (noise_tone)
filename = "coswave_mixed.wav"
for amp in [0.1,0.5,1,2,5]:
print(WARNING+"Frequency: "+str(freq)+END)
nice = Audio()
nice.generate_cosine_wave(200,duration=1)
noise = Audio()
noise.generate_cosine_wave(2000,amp=amp,duration=1)
mixed = Audio()
mixed.mix_signals([nice,noise])
mixed.save_audio(filename)
print(BOLD+"No filter:"+END)
mixed.plot_signal(title="Mixed cosine signal: nice of "+str(200)+" Hz and noise of "+str(2000)+" Hz with amplitude of "+str(amp),fontsize=20,Nseconds=.1,ylim=False)
display(mixed.read_audio(filename))
#apply high pass
mixed.apply_high_pass(filename)
print(BOLD+"High pass filter:"+END)
mixed.plot_signal(title="Mixed cosine signal: nice of "+str(200)+" Hz and noise of "+str(2000)+" Hz with amplitude of "+str(amp),fontsize=20,Nseconds=.1,ylim=False)
display(mixed.read_audio(filename))
#apply low pass
nice = Audio()
nice.generate_cosine_wave(200,duration=1)
noise = Audio()
noise.generate_cosine_wave(2000,amp=amp,duration=1)
mixed = Audio()
mixed.mix_signals([nice,noise])
mixed.save_audio(filename)
mixed.apply_low_pass(filename)
print(BOLD+"Low pass filter:"+END)
mixed.plot_signal(title="Mixed cosine signal: nice of "+str(200)+" Hz and noise of "+str(2000)+" Hz with amplitude of "+str(amp),fontsize=20,Nseconds=.1,ylim=False)
display(mixed.read_audio(filename))
#apply band pass
nice = Audio()
nice.generate_cosine_wave(200,duration=1)
noise = Audio()
noise.generate_cosine_wave(2000,amp=amp,duration=1)
mixed = Audio()
mixed.mix_signals([nice,noise])
mixed.save_audio(filename)
mixed.apply_band_pass(filename)
print(BOLD+"Band pass filter:"+END)
mixed.plot_signal(title="Mixed cosine signal: nice of "+str(200)+" Hz and noise of "+str(2000)+" Hz with amplitude of "+str(amp),fontsize=20,Nseconds=.1,ylim=False)
display(mixed.read_audio(filename))
Frequency: 2000 No filter:
High pass filter:
Low pass filter:
Band pass filter:
Frequency: 2000 No filter:
High pass filter:
Low pass filter:
Band pass filter:
Frequency: 2000 No filter:
High pass filter:
Low pass filter:
Band pass filter:
Frequency: 2000 No filter:
High pass filter:
Low pass filter:
Band pass filter:
Frequency: 2000 No filter:
High pass filter:
Low pass filter:
Band pass filter:
#scientific/ploting
import numpy as np
import scipy as sc
import matplotlib.pyplot as plt
#saving audios
from scipy.io.wavfile import write
from pydub import AudioSegment
from pydub.playback import play
#display on screen
from IPython.display import display, HTML
#colors
WARNING = '\033[93m'
HEADER = '\033[95m'
BOLD = '\033[1m'
END = '\033[0m'
#class containing methods I wrote
from audio import Audio
#real audio file: Heavy Metal Song
filename = "audio.wav"
song = Audio()
song.get_audio("song.wav")
song.save_audio(filename)
song.get_audio(filename)
print(BOLD+"No filter:"+END)
song.plot_signal("Real audio",fontsize=30,Nseconds=4,ylim=False)
display(song.read_audio(filename))
#apply high pass
song.apply_high_pass(filename,cutoff=10000,resize=True,ordem=11)
song.scale_audio(10)
print(BOLD+"High pass filter:"+END)
song.plot_signal("Real audio",fontsize=30,Nseconds=4,ylim=False)
display(song.read_audio(filename))
#apply low pass
song = Audio()
song.get_audio("song.wav")
song.save_audio(filename)
song.apply_low_pass(filename,cutoff=1000,resize=True,ordem=11)
print(BOLD+"Low pass filter:"+END)
song.plot_signal("Real audio",fontsize=30,Nseconds=4,ylim=False)
display(song.read_audio(filename))
#apply bandpass
song = Audio()
song.get_audio("song.wav")
song.save_audio(filename)
song.apply_band_pass(filename,cutoff=[1000,10000],resize=True,ordem=11)
print(BOLD+"Band pass filter:"+END)
song.plot_signal("Real audio",fontsize=30,Nseconds=4,ylim=False)
display(song.read_audio(filename))
No filter:
High pass filter:
Low pass filter:
Band pass filter:
#Class that contains generations and filtering of signals
import numpy as np
import scipy as sc
import matplotlib.pyplot as plt
from scipy.io.wavfile import write
from pydub import AudioSegment
from pydub.playback import play
from scipy.io import wavfile
from scipy import signal
class Audio:
#Signal rate and duration
rate = 44100 # determine number of data points the signal use to represnt wave by second
duration = 4 # general duration of audios (may or may not be)
def __init__(self):
self.tone = []
self.freq = 0
def generate_wave(self,freq,func,duration=duration,rate=rate,save=True):
t = np.linspace(0,duration,rate*duration) #time elapsed
f = func(freq*t)
if save==True :
self.atualize_audio(f)
self.atualize_freq(freq,duration)
return f
#Generate signal with cosine wave of frequency
def generate_cosine_wave(self,freq,amp=1,f0=0,duration=duration,rate=rate,save=True):
t = np.linspace(0,duration,rate*duration) #time elapsed
f = amp*np.cos(2*np.pi*freq*t+f0) #consertar f0
if save==True :
self.atualize_audio(f)
self.atualize_freq(freq,duration)
return f
def generate_cosine_exp_wave(self,freq,amp=1,factor=-1,f0=0,duration=duration,rate=rate,save=True):
t = np.linspace(0,duration,rate*duration) #time elapsed
f = amp*np.exp(factor*t)*np.cos(2*np.pi*freq*t+f0)
if save==True :
self.atualize_audio(f)
self.atualize_freq(freq,duration)
return f
def atualize_audio(self,audio):
self.tone = np.concatenate((self.tone,audio))
def scale_audio(self,factor):
self.tone *= factor
def clean_audio(self):
self.tone = []
def atualize_freq(self,freq,duration=duration): #smallest frequency dominate
if self.freq==0 or freq<self.freq :
self.freq = freq
def plot_signal(self,title="Signal",fontsize=20,Nseconds=1.0,figsize=(16,3),ylim=True):
plt.figure(figsize=figsize)
end = int(Nseconds*self.rate) #show only first Nseconds
time = np.linspace(0,Nseconds,int(self.rate*Nseconds))
plt.plot(time[:end],self.tone[:end])
plt.title(title,fontsize=fontsize)
if ylim:
plt.ylim((-1,1))
plt.show()
def mix_signals(self,signals):
if self.tone == []:
self.tone = [0]*len(signals[0].tone)
for signal in signals:
self.tone += signal.tone
self.atualize_freq(signal.freq,signal.duration)
def save_audio(self,filename):
normalized_tone = np.int16((self.tone / self.tone.max()) * 32767) #normalize for storage
write(filename,self.rate,normalized_tone)
def read_audio(self,filename):
audio = AudioSegment.from_wav(filename)
return audio
def play_audio(self,filename):
audio = AudioSegment.from_wav(filename)
play(audio)
def get_audio(self,filename):
fs, x = wavfile.read(filename)
self.tone = x
def apply_high_pass(self,filename,cutoff=1000,resize=True,ordem=101):
fs, x = wavfile.read(filename) # 16-bit mono 44.1 khz
b = signal.firwin(ordem,cutoff=cutoff,fs=fs,pass_zero='highpass')
x = signal.lfilter(b, [1.0], x)
wavfile.write(filename, fs, x.astype(np.int16))
self.tone = x
if resize:
self.tone = self.tone/32767
def apply_low_pass(self,filename,cutoff=1000,resize=True,ordem=101):
fs, x = wavfile.read(filename) # 16-bit mono 44.1 khz
b = signal.firwin(ordem,cutoff=cutoff,fs=fs,pass_zero='lowpass')
x = signal.lfilter(b, [1.0], x)
wavfile.write(filename, fs, x.astype(np.int16))
self.tone = x
if resize:
self.tone = self.tone/32767
def apply_band_pass(self,filename,cutoff=[900,1000],resize=True,ordem=101):
fs, x = wavfile.read(filename) # 16-bit mono 44.1 khz
b = signal.firwin(ordem,cutoff=cutoff,fs=fs,pass_zero='bandpass')
x = signal.lfilter(b, [1.0], x)
wavfile.write(filename, fs, x.astype(np.int16))
self.tone = x
if resize:
self.tone = self.tone/32767